package com.bjsxt;
/**入门案例*/
/*定义接口  接口中只有一个抽象方法*/
//无返回值，无参数
@FunctionalInterface
interface NoReturnNoParam{
    void method();
}
//无返回值，有一个参数
@FunctionalInterface
interface NoReturnOneParam{
    void method(int a);
}
//无返回值，有多个参数
@FunctionalInterface
interface NoReturnMultiParam{
    void method(int a,int b);
}
//有返回值，无参数
@FunctionalInterface
interface ReturnNoParam{
    int method();
}
//有返回值，有一个参数
@FunctionalInterface
interface ReturnOneParam {
   int method(int a);
}
//有返回值，有多个参数
@FunctionalInterface
interface ReturnMultiParam{
    int method(int a,int b);
}
public class Test01 {
    public static void main(String[] args) {
        //定义接口类型的变量
        //Lambda表达式是抽象方法的实现
        /* () -> {
            System.out.println("NoReturnNoParam");
        };  等于是上面接口的抽象方法的实现*/
        // （parameters）-> {expression;}
        NoReturnNoParam noReturnNoParam = () -> {
            System.out.println("NoReturnNoParam");
        };
        //Lambda表达式等同于实现了上面的NoReturnNoParam接口
        //接口中只有一个抽象方法
        noReturnNoParam.method();

        //无返回值，有一个参数
        NoReturnOneParam noReturnOneParam = (int a) -> {
            System.out.println("NoReturnOneParam " + a);
        };
        noReturnOneParam.method(10);
        //无返回值，有多个参数
        NoReturnMultiParam noReturnMultiParam = (int a, int b) -> {
            System.out.println("NoReturnMultiParam " + a + " " + b);
        };
        noReturnMultiParam.method(11, 12);

        //有返回值，无参数
        ReturnNoParam returnNoParam = () -> {
            System.out.print("ReturnNoParam ");
            return 10;//看返回的是什么类型，如果是String ,则给字符串
        };
        System.out.println(returnNoParam.method());
        //有返回值，有一个参数
        ReturnOneParam returnOneParam = (int a) -> {
            System.out.print("ReturnOneParam ");
            return a;
        };
        System.out.println(returnOneParam.method(21));

        //有返回值，有多个参数
        ReturnMultiParam returnMultiParam = (int a, int b) -> {
            System.out.print("ReturnMultiParam ");
            return a + b;
        };
        System.out.println(returnMultiParam.method(10, 20));
    }
    /*要求：
     * 1，参数的个数以及类型需要与函数接口中的抽象方法一致
     * 2，返回值类型要与函数接口中的抽象方法的返回值类型一致*/
    //在不同的类中，实现这个方法，这方法与上面的接口 返回值，有一个参数 类型对应
    public static int doubleNum(int a) {
        return 2 * a;
    }
    public int addTwo(int a){
        return a+2;
    }
}
